Процедура анализа

Для всех методов требуемых в условии

  1. Найти минимум функции простым вызовом метода.
  2. С определить колличество вычислений функции.
  3. С помощью функций trace_* найти путь поиска решения
  4. Построить анимированный график поиска решения
  5. Построить график поиска решения с точками, в которых была вычислена функция
  6. Построить график поиска решения с градиентом.

Собрать итоговую таблицу (data.frame), в которой строки соответствуют методам, а столбцы (значение функции, значение переменных, колличество вызовов функции)

Задание 1. Главное не поскользнуться

x <- seq(-2, 2, by = 0.1)
y <- task1$f(x)

op <- optimise(task1$f, c(-2, 2))

data <- data.frame(x, y)
fig <- plot_ly(data, x = ~x, y = ~y, type = 'scatter', mode = 'lines', name = "Function") |>
  add_markers(x = op$minimum, y = task1$f(op$minimum), color = 'red', size = 5, name = "Minimum")

fig
## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels

## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
op$minimum
## [1] -1.032349
op$objective
## [1] -2.006044

1111+exp(-x)+7cos(3x)+1x2-1x

  1. Найти минимум функции
  2. Построить график, выделить точку минимума

Задание 2. Горбы и ямы

Найти безусловный минимум функции двух переменных.

7x2+27xy+9y2+8exp[-((x-0)23+(y--3)25)]+9exp[-((x-1)25+(y-2)22)]+8exp[-((x--3)25+(y-0)25)]

С помощью методов: Nelder-Mead, PRAXIS, BFGS, CG.

(Для градиентных методов выразить градиент самостоятельно)

Вызвать функцию можно через объект

task2$f(c(1,2))
## [1] 80.18515

Провести анализ

задание 3. Окружен, но не сломлен

Найти условный минимум функции двух переменных, с ограничениями.

Решить задачу минимизации

7x2+27xy+9y2+8exp[-((x-0)23+(y--3)25)]+9exp[-((x-1)25+(y-2)22)]+8exp[-((x--3)25+(y-0)25)]

с ограничениями

x210+y23-xy56

x23+y2104+xy53

С помощью методов: cobyla, mma, ccsa, sslqp. Провести анализ.

Задание 4. За стеной

Свести задачу условной минимизации к безусловной

Решить задачу минимизации

7x2+27xy+9y2+8exp[-((x-0)23+(y--3)25)]+9exp[-((x-1)25+(y-2)22)]+8exp[-((x--3)25+(y-0)25)]

с ограничениями

\[\begin{cases} 3 \leq x \leq 6 \\ -7 \leq y \leq 2 \end{cases}\]

С помощью методов: Nelder-Mead, tnewton, BFGS, Rcg.

Провести анализ

Задание 5. Гладко было на бумаге, да забыли про овраги

Найти безусловный минимум сильно вытянутой вдоль функции двух переменных

(9x+8y-5)4+(5x+2y-1)4

Вызвать функцию можно через объект

task2$f(c(1,2))
## [1] 80.18515

С помощью методов: Nelder-Mead, tnewton, BFGS, varmetric. Провести анализ

Задание 6. Дальше больше

Провести анализ для всех предложенных функций (n=50,100,500,1000) \[F=(\sum_{i=1}^N{L_ix_i}-b)^2\]

Вызвать функцию можно через объект

task6$f50(runif(50))
## [1] 7217.512

Гиперэллипсоиды для 50, 100, 1000 переменных. С помощью методов: Nelder-Mead, tnewton, BFGS, Rcg.

Задание 7. Реальный мир

найти минимум любым доступным методом (реализованным в R), для 3-ех функций из репозитория

Провести анализ.

task7_gen <- function()
{
  set.seed(base_seed + 7)
  get_fun <- function(path)
  {
    source(path, local = TRUE)
    as.list(environment())
  }
  l <- lapply('Box' |> dir(recursive = TRUE, full.names = TRUE) |> sample(3), get_fun)
  names(l) <- sapply(seq_len(3), \(i) paste0('t', i))
  l
}
task7 <- task7_gen()

Рассмотрим пример. Ограничения для функции

task7$t1$get_xl(2)
## [1] -500 -500
task7$t1$get_xu(2)
## [1] 500 500

Минимальное значение функции и аргумент при котором оно реализуется

task7$t1$get_xmin(2)
## [1]  0.5 -0.5
task7$t1$get_fmin(2)
## [1] -2000.004
task7$t1$ChenV(c(10,10))
## [1] -1000

Саму функцию можно получить

task7$t1$ChenV
## function (x) 
## {
##     if (missing(x)) {
##         return(list(nx = 2, ng = 0, nh = 0, xl = function(nx) get_xl(nx), 
##             xu = function(nx) get_xu(nx), fmin = function(nx) get_fmin(nx), 
##             xmin = function(nx) get_xmin(nx), features = c(1, 
##                 0, 0, 1, 0, 0, 0, 1), libraries = c(0, 0, 0, 
##                 0, 1, 0, 0, 0, 0, 0)))
##     }
##     y <- -(0.001/(0.001^2 + (x[1]^2 + x[2]^2 - 1)^2)) - (0.001/(0.001^2 + 
##         (x[1]^2 + x[2]^2 - 0.5)^2)) - (0.001/(0.001^2 + (x[1]^2 - 
##         x[2]^2)^2))
##     return(y)
## }
## <environment: 0x000001a2be86ccc8>

Вызов функции

task7$t1$ChenV(c(1,1))
## [1] -1000.001